/*
 * PRGRAM: STEROWNIK SILNIKA KROKOWEGO ATMEGA8
 *
 *
 * AUTOR: PRZEMYSŁAW GACKA
 */


//#define F_CPU  1000000L
#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdbool.h>
//#include <avr/signal.h>

volatile unsigned int liczba=0;
bool flaga_czas=0;
bool kierunek=0;
unsigned char czas=0;

ISR(TIMER0_OVF_vect)
{

	//TCNT0=1;
	flaga_czas=1;
	TCCR0 &= ~ (_BV(CS02) );
	PORTD ^= _BV(3);
	//PORTD = _BV(3);

}


inline void time_ON(void)
{
	//PORTD |= _BV(3);
	//for(int y=0;y<1000;y++)

	TCCR0 |= _BV(CS02) ;
	while(!(flaga_czas==1))
	{

		//_delay_ms(2);

    //(_BV(CS02) |  _BV(CS00));
	}


	flaga_czas=0;

	//PORTD &= ~_BV(3);
	//flaga_czas=0;
	TCNT0=czas;

	PORTD ^= _BV(3);
}

void step_one(void)
{
char stan[]={8,2,4,1};
signed char o=0;

if(kierunek==1)
  {
  o=4;
    for(signed char k=3;k>=0;k--)
    {

    PORTC &= ~255;
    PORTC |= stan[k];
    //_delay_ms(1);
    time_ON();
    }

 }else
 {
    for(signed char k=0;k<=3;k++)
    {
    //PORTC &= stan[k];
    //time_ON();
    }

 }

/*
	PORTC |= _BV(4) ;
		_delay_ms(2);
		PORTC &= ~_BV(4) ;
		PORTC |= _BV(2) ;
		_delay_ms(2);
		PORTC &= ~_BV(2) ;
			PORTC |= _BV(3) ;
		_delay_ms(2);
		PORTC &= ~_BV(3) ;
		PORTC |= _BV(1) ;
		_delay_ms(2);
	    PORTC &= ~_BV(1) ;
	    */
}


int main(void)
{

    //Piny silnika
	DDRC  |= _BV(4) | _BV(3) | _BV(2) | _BV(1);
    //Diody LED
    DDRD  |= _BV(3)|_BV(4);
	//Przyciski
    PORTD |= _BV(5) | _BV(6);
    //Konfiguracja timera
   // TCCR0=5; // nie ma preskalera dla 1, rozdział 14.7.1
             //wartość wpisywania do licznika (max 255)
    TIMSK |= _BV(TOIE0); //maski rozdział 14.7.3
    TCNT0=0;
    sei();

   _delay_ms(200);
	//if(!(PIND & 1<<5))
	while(!(bit_is_clear(PIND,5)))
	 {}

	        _delay_ms(200);

	       while(bit_is_clear(PIND,5)) {}
	/* Czas na wygaśnięcie drgań styków przycisku*/
	    _delay_ms(80);


     kierunek=1;
     for(int l=0; l<192;l++)
     {
     step_one();
     }


/*
for(int l=0; l<192;l++)
{
	PORTC |= _BV(4) ;
	_delay_ms(2);
	PORTC &= ~_BV(4) ;
	PORTC |= _BV(2) ;
	_delay_ms(2);
	PORTC &= ~_BV(2) ;
		PORTC |= _BV(3) ;
	_delay_ms(2);
	PORTC &= ~_BV(3) ;
	PORTC |= _BV(1) ;
	_delay_ms(2);
    PORTC &= ~_BV(1) ;

}



_delay_ms(200);
PORTD |= _BV(3) ;
_delay_ms(200);
_delay_ms(200);
for(int t=0; t<192;t++)
{
	PORTC |= _BV(1) ;
	_delay_ms(10);
	PORTC &= ~_BV(1) ;
	PORTC |= _BV(3) ;
	_delay_ms(10);
	PORTC &= ~_BV(3) ;
		PORTC |= _BV(2) ;
	_delay_ms(10);
	PORTC &= ~_BV(2) ;
	PORTC |= _BV(4) ;
	_delay_ms(10);
	PORTC &= ~_BV(4) ;

}

*/
	//PORTD |= _BV(3);
	//bit_is_clear(PIND,5)







   //PORTD |= _BV(4);
   //PORTD |= _BV(3); PORTD |= _BV(4);
  //  PORTD &= ~_BV(4);
    //DDRD  &= ~_BV(0);
   // PORTD |=  _BV(0);


       // PORTB ^=_BV(0);
       // PORTB ^=_BV(1);
    	//PORTD ^= _BV(3);
        //_delay_ms((PIND & _BV(0))? 1000: 200);
    while(1)
    {}
}
